package MethodDemo;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class Demo {
    public static void main(String[] args) {
        //创建目标对象/被代理对象
        User user=new User();
        //执行代理方法
        //使用jdk的动态代理
        //参数一：和目标对象一样的类加载器
        //参数二：目标对象的接口底层会实现和目标对象一样的接口从而达到和目标对象具有一样的方法
        //参数三：InvocationHander的实现类这个实现类就是用来处理所有增强业务的（这里我们用匿名内部类的方式实现）；
        Iuser user1 = (Iuser)Proxy.newProxyInstance(User.class.getClassLoader(), new Class[]{Iuser.class}, new InvocationHandler() {
            @Override
            //1固定格式尽量不要动
            //2核心要增强的方法
            //3增强方法的过程中需要的参数
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.out.println("执行保存前");
                //第一个参数是要增强那个对象里面的方法
                //第二参数是增强过程中要传递的参数如果增强的方法中没有的参数args可以省略
                method.invoke(user,args);
                System.out.println("执行保存后");


                return null;
            }
        });
        //调用代理的方法
        user1.save();

    }
}
